November 25, 2015
·
读书笔记
Scalable IO in Java
- 传统的服务器设计,通常是这样接收请求的:
- 每一个请求会创建一个线程,用该线程执行handler
- 缺陷是IO阻塞会耗费大量资源
- 基础的Reactor模式
- Reactor负责将io事件分发给handler
- Handler负责执行非阻塞任务(handler可以类比为按钮的ActionListener)
- nio的一些概念:
- 一个channel对应一个连接。类似于outputstream和inputstream的合集。
- Selector可以管理多个channel,并能够知晓通道是否为诸如读写事件做好准备。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接
- SelectionKey对应一个io事件,包含了状态和相关的channel,selector等对象
- 示例:一个Selector的打开和持续监听事件(这个可以粗略的认为是Reactor模式在nio的实现,每个client可以看做一个channel,Reactor可以看做一个while循环里面不断selector.select()取出selectionKey然后处理,整个流程是单线程的处理了多个连接)
- 上述的模式(上面的代码)缺点是handle部分可能会占用过长时间从而使reactor变慢,因此可以改进为多线程处理业务逻辑:
- 考虑到多核cpu,可以再改进为多reactor的模式:
- mainReactor主要是监听客户请求:serverSocket.accept(),拿到channel再交给subReactor
- 一个subReactor就是一个Selector(多个subReactor就是Selector数组了)
- 具体代码,可以直接百度本笔记的标题。